package com.kk.my_pro.common.result;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;

/**
 * The type Api result.
 *
 * @param <T> the type parameter
 * @author wxj
 */
@Data
@ToString
@ApiModel(value = "接口响应实体")
public class ApiResult<T> {
    /**
     * 业务错误码
     */
    @ApiModelProperty(value = "业务错误码")
    private Integer code;
    /**
     * 信息描述
     */
    @ApiModelProperty(value = "信息描述")
    private String message;
    /**
     * 返回参数
     */
    @ApiModelProperty(value = "返回内容")
    private T data;

    public ApiResult(ApiResultStatus apiResultStatus, T data) {
        this.code = apiResultStatus.getCode();
        this.message = apiResultStatus.getMessage();
        this.data = data;
    }

    public ApiResult(ApiResultStatus apiResultStatus, String message) {
        this.code = apiResultStatus.getCode();
        this.message = message;
    }

    /**
     * 业务成功返回业务代码和描述信息
     */
    public static ApiResult<Void> success() {
        return new ApiResult<>(ApiResultStatus.SUCCESS, (Void) null);
    }

    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static <T> ApiResult<T> success(T data) {
        return new ApiResult<T>(ApiResultStatus.SUCCESS, data);
    }

    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static <T> ApiResult<T> success(ApiResultStatus apiResultStatus, T data) {
        if (apiResultStatus == null) {
            return success(data);
        }
        return new ApiResult<T>(apiResultStatus, data);
    }

    /**
     * 业务异常返回业务代码和描述信息
     */
    public static <T> ApiResult<T> failure() {
        return new ApiResult<T>(ApiResultStatus.INTERNAL_SERVER_ERROR, (T) null);
    }

    /**
     * 业务异常返回业务代码和描述信息
     */
    public static <T> ApiResult<T> failure(String message) {
        return new ApiResult<>(ApiResultStatus.BAD_REQUEST, message);
    }

    /**
     * 业务异常返回业务代码,描述和返回的参数
     */
    public static <T> ApiResult<T> failure(ApiResultStatus apiResultStatus) {
        return failure(apiResultStatus, null);
    }

    /**
     * 业务异常返回业务代码,描述和返回的参数
     */
    public static <T> ApiResult<T> failure(ApiResultStatus apiResultStatus, T data) {
        if (apiResultStatus == null) {
            return new ApiResult<T>(ApiResultStatus.INTERNAL_SERVER_ERROR, (T) null);
        }
        return new ApiResult<T>(apiResultStatus, data);
    }

    /**
     * 无权限
     */
    public static ApiResult<String> forbidden(String data) {
        return new ApiResult<>(ApiResultStatus.FORBIDDEN, data);
    }


    /**
     * 未授权
     */
    public static ApiResult<String> unauthorized(String data) {
        return new ApiResult<>(ApiResultStatus.UNAUTHORIZED, data);
    }

    /**
     * 业务异常返回业务代码和描述信息
     */
    public static <T> ApiResult<T> notFound() {
        return new ApiResult<>(ApiResultStatus.NOT_FOUND, null);
    }
}
